package main

import "fmt"

func H1() {
	var slice1 = make([]int, 1, 2)
	// 使用cap获取切片的容量
	fmt.Printf("容量：%d， 长度：%d， 值：%d\n", len(slice1), cap(slice1), slice1)

	// 只有一个参数时， 默认为 容量长度都是3， 元素时默认值
	var slice2 = make([]int, 3)
	fmt.Printf("容量：%d， 长度：%d， 值：%d", len(slice2), cap(slice2), slice2)
}

// 切片的复制
func H2() {
	// 切片复制的时候， 他们指向的是同一个内存地址
	// 当复制的变量追加值的时候， 原切片打印的是本身的元素， 复制切片打印的是原切片带追加元素
	var slice1 = make([]int, 3, 5)
	slice1[2] = 899
	slice2 := append(slice1, 10)

	fmt.Printf("s1长度：%d  s1容量：%d  s1地址：%p s1值：%d\n", len(slice1), cap(slice1), &slice1, slice1)
	fmt.Printf("s2长度：%d  s2容量：%d  s2地址：%p s2值：%d\n", len(slice2), cap(slice2), &slice2, slice2)

	// 当复制切片修改了原切片已有的元素时， 原切片的元素随之发生变化
	// 这点证明了 他们时相同的内存地址
	slice3 := slice1
	slice3[0] = 9
	fmt.Printf("s1长度：%d  s1容量：%d  s1地址：%p s1值：%d\n", len(slice1), cap(slice1), &slice1, slice1)
	fmt.Printf("s3长度：%d  s3容量：%d  s3地址：%p s3值：%d\n", len(slice3), cap(slice3), &slice3, slice3)
}

// 切片的扩容
func H3() {
	var slice1 = []int{1, 2}

	slice2 := append(slice1, 99)
	fmt.Printf("val:%d,len:%d, cap:%d, mem:%p\n", slice1, len(slice1), cap(slice1), &slice1)
	fmt.Printf("val:%d,len:%d, cap:%d, mem:%p\n", slice2, len(slice2), cap(slice2), &slice2)

	slice2[0] = 99
	fmt.Printf("val:%d,len:%d, cap:%d, mem:%p\n", slice1, len(slice1), cap(slice1), &slice1)
	fmt.Printf("val:%d,len:%d, cap:%d, mem:%p\n", slice2, len(slice2), cap(slice2), &slice2)
}
